//Emil Fihlman //gcc -Wall -Werror -Wextra -flto -O3 -o serial serial.c #include #include #include #include #include #include #include void init(unsigned int baudrate, int serial, struct termios *terminal, struct termios *backup, struct termios *serialport) { tcgetattr(0, backup); tcgetattr(0, terminal); // cfmakeraw(terminal); terminal->c_lflag&=~ICANON; terminal->c_lflag&=~ECHO; terminal->c_cc[VMIN]=1; terminal->c_cc[VTIME]=0; tcsetattr(0, TCSANOW, terminal); tcgetattr(serial, serialport); cfsetspeed(serialport, baudrate); cfmakeraw(serialport); /* serialport->c_cflag |= (CLOCAL | CREAD); serialport->c_cflag &= ~CSIZE; serialport->c_cflag &= ~CSTOPB; serialport->c_cflag |= CS8; serialport->c_cc[VMIN]=1; serialport->c_cc[VTIME]=0; */ tcsetattr(serial, TCSANOW, serialport); // fcntl(serial, F_SETFL, FNDELAY); } int main(int argc, char *argv[]) { struct termios terminal={0}, backup={0}, serialport={0}; unsigned char buf[1024]; unsigned int baudrate=115200; int i,serial; fd_set set; if(argc<2) { fprintf(stderr, "Usage: %s path [baudrate]\n", argv[0]); return(1); } serial=open(argv[1], O_RDWR | O_NOCTTY | O_NONBLOCK); if(serial==-1) { fprintf(stderr, "Unable to open device %s\n", argv[1]); return(2); } if(argc>2) { baudrate=(unsigned int)strtoul(argv[2], NULL, 10); switch(baudrate) { case 50: case 75: case 110: case 134: case 150: case 200: case 300: case 600: case 1200: case 1800: case 2400: case 4800: case 9600: case 14400: case 19200: case 28800: case 38400: case 57600: case 76800: case 115200: case 230400: case 250000: case 500000: case 1000000: case 2000000: break; default: fprintf(stderr, "Unsupported baudrate %u\n", baudrate); return(3); } } init(baudrate, serial, &terminal, &backup, &serialport); // fprintf(stderr, "\e[?25l\n"); while(1) { FD_ZERO(&set); FD_SET(0, &set); FD_SET(serial, &set); if(select(serial+1, &set, NULL, NULL, NULL)==-1) { break; } if(FD_ISSET(0, &set)) { if((i=read(0, buf, 1))>0) { write(serial, buf, i); } } if(FD_ISSET(serial, &set)) { if((i=read(serial, buf, 1))>0) { write(1, buf, i); } } } tcsetattr(0, TCSANOW, &backup); fflush(stdout); // fprintf(stderr, "\e[?25h"); return(0); }